package br.uvv.Web.ManagedBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.uvv.Model.ClienteProjeto;
import br.uvv.Model.Projeto;
import br.uvv.Service.ProjetoService;
import br.uvv.Util.InitUtil;
import br.uvv.Util.RNException;
import br.uvv.Util.Util;

public class ProjetoBean implements Serializable {

	private static final long serialVersionUID = 2861011385022688997L;

	private ProjetoService service;
	
	private Projeto projetoInstance;
	private Projeto projetoInstanceTemp;
	private LazyDataModel<Projeto> projetoList;
	
	private String varBuscaProjeto;
	private String varBuscaCodigo;
	private String varBuscaCliente;
	
	private LazyDataModel<ClienteProjeto> clienteProjetoList;
	
	private void init(){
		service = new ProjetoService();
		projetoInstance = new Projeto();
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = null;
		projetoList = InitUtil.inicializaProjetoList();
		clienteProjetoList = InitUtil.inicializaClienteProjetoList();
	}
	
	public String projeto(){
		init();
		return "/views/projeto/show.xhtml";
	}
	
	public String goCreate(){
		projetoInstance = new Projeto();
		return "/views/projeto/create.xhtml";
	}
	
	public String goEdit(){
		return "/views/projeto/edit.xhtml";
	}
	
	public String salvarProjeto(){
		try {
			service.salvarProjeto(projetoInstance);
			return "/views/projeto/show.xhtml";
		} catch (RNException e){
			return "/views/projeto/create.xhtml";
		}
	}
	
	public String atualizarProjeto(){
		try {
			service.atualizarProjeto(projetoInstance);
			return "/views/projeto/show.xhtml";
		} catch (RNException e){
			return "/views/projeto/edit.xhtml";
		}
	}
	
	public void removerProjeto(){
		try {
			service.removerProjeto(projetoInstance);
			
		} catch (RNException e){
			
		}
	}
	
	public String visualizarDescricoes(){
		//visualizar a lista de descricções do projeto? Ou já direcionar com o projeto selecionado?
		return "";
	}
	
	@SuppressWarnings("serial")
	public void filtrarProjeto(){
		projetoList = new LazyDataModel<Projeto>() {
			@Override
			public List<Projeto> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				Util.setDataTableRows(pageSize);
				try {
					return service.listarProjeto(first, pageSize, sortField, sortOrder, varBuscaCodigo, varBuscaProjeto, varBuscaCliente);
				} catch (RNException e) {
					e.printStackTrace();
					return new ArrayList<Projeto>();
				}
			}
			@Override  
	        public Projeto getRowData(String rowKey)  
	        {  
	        	try {
		            return service.selecionarProjeto(Long.parseLong(rowKey));
	        	} catch (RNException e) {
	        		e.printStackTrace();
	        		return new Projeto();
	        	} catch (NumberFormatException e){
	        		return new Projeto();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Projeto objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		try {
			projetoList.setRowCount(service.countProjeto(varBuscaCodigo, varBuscaProjeto, varBuscaCliente));
		} catch (RNException e) {
			e.printStackTrace();
		}
		projetoList.setPageSize(5);
	}
	
	public void selecionarProjeto(){
		projetoInstance = projetoInstanceTemp;
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = "";
		projetoList = InitUtil.inicializaProjetoList();
	}
	
	public void cancelarSelecionarProjeto(){
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = "";
		projetoList = InitUtil.inicializaProjetoList();
	}
	
	//Componentizar a busca por projeto!
	public void goHome(){
		service = null;
		projetoInstance = null;
		projetoInstanceTemp = null;
		varBuscaProjeto = null;
		projetoList = null;
	}

	public Projeto getProjetoInstance() {
		return projetoInstance;
	}

	public void setProjetoInstance(Projeto projetoInstance) {
		this.projetoInstance = projetoInstance;
	}

	public Projeto getProjetoInstanceTemp() {
		return projetoInstanceTemp;
	}

	public void setProjetoInstanceTemp(Projeto projetoInstanceTemp) {
		this.projetoInstanceTemp = projetoInstanceTemp;
	}

	public LazyDataModel<Projeto> getProjetoList() {
		return projetoList;
	}

	public void setProjetoList(LazyDataModel<Projeto> projetoList) {
		this.projetoList = projetoList;
	}

	public String getVarBuscaProjeto() {
		return varBuscaProjeto;
	}

	public void setVarBuscaProjeto(String varBuscaProjeto) {
		this.varBuscaProjeto = varBuscaProjeto;
	}
	
	public void setClienteProjetoList(
			LazyDataModel<ClienteProjeto> clienteProjetoList) {
		this.clienteProjetoList = clienteProjetoList;
	}
	
	public void setService(ProjetoService service) {
		this.service = service;
	}
	
	public String getVarBuscaCliente() {
		return varBuscaCliente;
	}
	
	public void setVarBuscaCliente(String varBuscaCliente) {
		this.varBuscaCliente = varBuscaCliente;
	}
	
	public String getVarBuscaCodigo() {
		return varBuscaCodigo;
	}
	
	public void setVarBuscaCodigo(String varBuscaCodigo) {
		this.varBuscaCodigo = varBuscaCodigo;
	}
	
	public LazyDataModel<ClienteProjeto> getClienteProjetoList() {
		return clienteProjetoList;
	}
	
}
